home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / m68k / tutor.arc / X.SA < prev    next >
Text File  |  1990-01-05  |  8KB  |  240 lines

  1. X        IDNT      1,1       COMMON I/O                              05/17/82
  2.  
  3.          XDEF      BUFFSIZE
  4.          XDEF      CRPADS
  5.          XDEF      FIXBUF
  6.          XDEF      GETSER1
  7.          XDEF      GETSER2
  8.          XDEF      NULLPADS
  9.          XDEF      OUTCH1
  10.          XDEF      OUTP2
  11.          XDEF      OUT1CR
  12.          XDEF      OUT1CR0
  13.          XDEF      OUTPUT
  14.          XDEF      OUTPUT2
  15.          XDEF      OUTPUT20
  16.          XDEF      OUTPUT21
  17.          XDEF      PORTIN1
  18.          XDEF      PORTIN1N
  19.          XDEF      PORTIN10
  20.  
  21.  SPC 1
  22.          XREF.S    ALTSER1
  23.          XREF.S    ALTSER2
  24.          XREF.S    BUFFER
  25.          XREF      INCHNE
  26.          XREF.S    INFROM
  27.          XREF.S    INPORT1
  28.          XREF      OUTCH
  29.          XREF.S    OUTPORT1
  30.          XREF.S    OUTPORT2
  31.          XREF.S    OUTTO
  32.          XREF      SER1
  33.          XREF      SER2
  34.          XREF.S    XONOFF
  35.  
  36. BUFFSIZE EQU       128
  37. CR       EQU       $D
  38. LF       EQU       $A
  39. CTLD     EQU       $4
  40. CTLH     EQU       $8
  41. CTLX     EQU       $18
  42. DEL      EQU       $7F
  43.  PAGE
  44.          SECTION.S 1
  45. NULLPADS DS.B 2  CHARACTER NULL PADS
  46. CRPADS   DS.B 2  CARRIAGE RETURN NULL PADS
  47.  
  48.          SECTION   11
  49. ******************************
  50. *
  51. *    SEND LINE TO PORT1 WITH CR/LF
  52. *
  53. OUT1CR   MOVE.B    #$D,(A6)+           CR
  54.          MOVE.B    #$A,(A6)+           LF
  55.          TST.L OUTTO  SEE IF ALTERNATE ADDRESS
  56.          BEQ.S OUT1CRX
  57.          MOVE.L OUTTO,-(A7)  PUSH ON STACK
  58.          RTS . GO DO IT
  59. OUT1CRX  MOVE.L OUTPORT1,-(A7)  GO TO I/O ADDRESS
  60.          RTS  . (THIS NORMALLY GOES TO OUT1CR0)
  61. *
  62. OUT1CR0  DS      0
  63. *
  64. *    OUTPUT BUFFER TO PORT1
  65. *
  66. OUTPUT   MOVEM.L D0-D3/A0-A1,-(A7)  GET SOME WORKING ROOM
  67.          CLR.L D3            D3 = NO OFFSET INTO NULL CHARACTERS
  68.          BSR.S     GETSER1         A0 = GET SERIAL PORT 1 ADDRESS
  69.          BRA.S OUTP2
  70. *
  71. *    SEND LINE TO PORT2 WITH CR
  72. *
  73. OUTPUT2  MOVE.B  #$D,(A6)+   TACK ON A "CR"
  74.          TST.L   OUTTO       SEE IF ALTERNATE ADDRESS
  75.          BEQ.S OUTPUT2X
  76.          MOVE.L OUTTO,-(A7)  PUSH ON STACK
  77.          RTS .  GO DO IT
  78. OUTPUT2X MOVE.L OUTPORT2,-(A7)  GO TO IO ROUTINE
  79.          RTS .  (THIS NORMALLY GOES TO OUTPUT20)
  80. *
  81. OUTPUT20 DS      0
  82. *
  83. *     OUTPUT BUFFER TO PORT2
  84. *
  85. OUTPUT21 MOVEM.L D0-D3/A0-A1,-(A7)
  86.          MOVE.L #1,D3  SIGNAL FOR PORT2
  87.          BSR.S     GETSER2   RETURNS SERIAL PORT 2 BASE ADDRESS IN A0
  88. *
  89. *   SEND BUFFER TO PORT
  90. *
  91. OUTP2    CMP.L A6,A5  SEE IF AT OR BEYOND END OF LINE
  92.          BCS.S OUTP3  NO... KEEP GOING, ELSE
  93.          MOVEM.L (A7)+,D0-D3/A0-A1  RESTORE REGISTERS
  94.          RTS .   END OF ROUTINE
  95. OUTP3    MOVE.B (A5)+,D0   GRAB BYTE TO OUTPUT
  96.          BSR.S OUTCH1  GO PRINT IT
  97.          BRA.S OUTP2   GO DO ANOTHER
  98.  PAGE
  99. *   SEND CHARACTER IN D0.B TO PORT1
  100. *   WHOSE BASE ADDRESS IS IN A0
  101. *   D3=0 FOR PORT1  D3=1 FOR PORT2
  102. *   PUTS IN NULL PADDING AS NEEDED
  103. *
  104. OUTCH1   BSR       OUTCH   GO PRINT D0
  105.          TST.B D0  SEE IF NULL
  106.          BEQ.S OUTCHRTS  JUST END IF NULL
  107.          CLR.L D2  CLEAR UPPER BYTES OF NULL LOOP COUNTER
  108.          LEA       NULLPADS,A1  FORM ADDRESS OF PADS
  109.          ADD.L D3,A1   D3=0 FOR PORT1 1=PORT2
  110.          MOVE.B (A1),D2  DEFAULT NULL PADS
  111.          CMP.B #$D,D0    SEE IF CR
  112.          BNE.S OUTCH2
  113.          LEA       CRPADS,A1  FORM ADDRESS OF CR PADS
  114.          ADD.L D3,A1   D3=0 FOR PORT1  1=PORT2
  115.          MOVE.B (A1),D2  NULLS AFTER CR
  116. OUTCH2   TST.L D2  SEE IF ANY PADDS TO BE SEND
  117.          BEQ.S OUTCHRTS  0=NONE
  118.          CLR.L D0  0=NULL CHAR TO BE SEND
  119. OUTCH3   BSR       OUTCH   SEND A NULL
  120.          SUB.L #1,D2  LOOP AROUND
  121.          BNE OUTCH3
  122. OUTCHRTS RTS .  END OF OUTCH ROUTINE
  123.  PAGE
  124. *
  125. *   GET BASE ADDRESS OF SERIAL PORT 1 IN  A0
  126. *
  127.  SPC 1
  128. GETSER1  LEA       SER1,A0   DEFAULT
  129.          TST.L     ALTSER1   IF ALTERNATE IS ZERO
  130.          BEQ.S     RETURN    THEN RETURN
  131.          MOVE.L    ALTSER1,A0  ELSE USE ALTERNATE SERIAL PORT 1
  132. RETURN   RTS       RETURN  (USED FROM A COUPLE OF PLACES)
  133.  SPC 2
  134.  
  135. *
  136. *   GET BASE ADDRESS OF SERIAL PORT 2 IN A0
  137. *
  138.  SPC 1
  139. GETSER2  LEA       SER2,A0   DEFAULT SERIAL PORT 2
  140.          TST.L     ALTSER2   IF ALTERNATE IS ZERO
  141.          BEQ       RETURN    THEN RETURN
  142.          MOVE.L ALTSER2,A0   ELSE USE ALTERNATE SERIAL PORT 2
  143.          RTS                 RETURN
  144. *
  145. *     FIX THE BUFFER A5 & A6 SET TO START OF BUFFER QUE
  146. *
  147. FIXBUF   LEA       BUFFER,A5
  148.          MOVE.L A5,A6
  149.          RTS
  150.  PAGE
  151. *   INPUT A LINE FROM PORT1
  152. *
  153. PORTIN1  TST.L INFROM          SEE IF ALTERNAME ADDRESS
  154.          BEQ.S PORTIN1X
  155.          MOVE.L INFROM,-(A7)   PUSH ON STACK
  156.          RTS                   .  GO DO IT
  157. PORTIN1X MOVE.L INPORT1,-(A7)  GO TO IO ROUTINE
  158.          RTS                   .  NORMALLY GOES TO PORTIN10
  159.  SPC 4
  160. PORTIN1N MOVEM.L D0-D4/D7/A0-A2,-(A7)
  161.          TST.B     XONOFF+2
  162.          BNE.S     PORTIN1V  OVERRIDE "No Auto Line Feed"
  163.          MOVE.L  #1,D7       "No Auto Line Feed" Entry point
  164.          BRA.S   PORTIN1W
  165.  SPC 3
  166. * ENTRY ALSO POSSIBLE FROM:  PORTIN2
  167. PORTIN10 MOVEM.L D0-D4/D7/A0-A2,-(A7)
  168. PORTIN1V CLR.L   D7          "Auto Line Feed" Entry point.
  169. PORTIN1W CLR.L D3          FLAG AS PORT1
  170.          BSR GETSER1       MOVE ADDRESS INTO A0
  171.  SPC 1
  172. READBUF  BSR INCHNE        GO GET SOME DATA  (NO ECHO)
  173.          TST.B D0          CHECK FOR NULLS
  174.          BEQ.S READBUF
  175.          MOVE.W D0,D4      SAVE FOR A WHILE
  176.          BSR OUTCH1        ECHO WHAT IS IN D0
  177.          MOVE.W D4,D0      RESTORE IT
  178.          CMP.B #LF,D0      SEE IF LINE FEED
  179.          BEQ.S READBUF     DONT PUT IT IN BUFFER
  180.  SPC 1
  181.          CMP.B #CTLX,D0    SEE IF CTRL-X "CANCEL LINE"
  182.          BNE.S CHKCTLH     No... Then go check for backspace
  183.          MOVE.L #CR,D0     Yes.. 1) Send a carriage return
  184.          BSR OUTCH1        *
  185.          MOVE.L #LF,D0     *     2) Send a line feed
  186.          BSR OUTCH1        *
  187.          MOVE.L A5,A6      *     3) Set BUFFER at start again
  188.          BRA.S READBUF     *     4) Restart this routine
  189.  SPC 1
  190. CHKCTLH  CMP.B #CTLH,D0    CTRL-H? (Backspace)
  191.          BEQ.S BS4CTLH     Yes...  Go backspace 1 character
  192.          CMP.B #DEL,D0     DEL?    (Also a Backspace)
  193.          BNE.S CHKCTLD     No....  Then go check for CTRL D
  194. BKSPACE  CMP.L  A5,A6      Yes...  Usually need an extra "Backspace"
  195.          BEQ    READBUF    If at start of buffer, don't back up any more.
  196.          MOVE.B #CTLH,D0    Backspace cursor.
  197.          BSR    OUTCH1     *
  198.          BRA.S  BLANKIT    Bypass check for start of buffer
  199.  SPC 1
  200. BS4CTLH  DS     0          CTL-H already backed up 1 character.
  201.          CMP.L  A5,A6      At beginning of buffer?
  202.          BEQ    READBUF    Yes...  Then don't back up any more.
  203. BLANKIT  MOVE.L #$20,D0    Now blank out previous character.
  204.          BSR   OUTCH1      *
  205.          MOVE.B -(A6),D0   Remove last character from buffer.
  206.          MOVE.B  #CTLH,D0   Backup cursor again.
  207.          BSR   OUTCH1      *
  208.          BRA   READBUF     Go get next character.
  209.  SPC 1
  210. CHKCTLD  CMP.B #CTLD,D0    CTL D?  (REPRINT)
  211.          BNE.S CHKCR       No....  Then go check if a "CR".
  212.          MOVE.L #CR,D0     Yes...  Print "CR"
  213.          BSR OUTCH1        *
  214.          MOVE.L #LF,D0     Print "LF"
  215.          BSR OUTCH1        *
  216.          MOVE.L A5,-(A7)  SAVE ON STACK FOR A MOMENT
  217.          BSR OUTPUT    GO PRINT BUFFER
  218.          MOVE.L (A7)+,A5  GET BACK FROM STACK
  219.          BRA READBUF
  220.  SPC 1
  221. CHARSAVE MOVE.B D0,(A6)+   SAVE DATA INTO BUFFER
  222.          MOVE.L A6,D1      CALCULATE ROOM USED
  223.          SUB.L A5,D1       DONT USE MORE THAN "BUFFSIZE"
  224.          CMP.W #BUFFSIZE,D1
  225.          BMI READBUF       We're OK, go get next character.
  226.          BRA BKSPACE       If not, handle as though a "CNTL-H"
  227.  SPC 1
  228. CHKCR    CMP.B #CR,D0      CR?  (End of command line).
  229.          BNE.S CHARSAVE    No.. Then go store this character.
  230.  SPC 1
  231.          TST.B D7          Check "Auto Line Feed" switch
  232.          BNE.S  NOAUTOLF   Yes.. Bypass sending Line feed.
  233.          MOVE.L #LF,D0     No... Set one up and...
  234.          BSR    OUTCH1     .     Send it!
  235. NOAUTOLF DS     0          .
  236.  SPC 1
  237.  MOVEM.L (A7)+,D0-D4/D7/A0-A2 Restore Regs.
  238.          RTS               RETURN TO CALLER
  239.  SPC 1
  240.          END